package com.example.chengzhengwei.utils;

public class HexUtils {

    /**
     * 将十六进制字符串（空格分隔）转换为字节数组
     * @param hexString 十六进制字符串，例如："55 01 85 00 16 ... AA"
     * @return 对应的字节数组
     * @throws IllegalArgumentException 如果输入包含无效字符
     */
    public static byte[] hexStringToByteArray(String hexString) {
        // 移除所有空白字符（空格、制表符等）
        String cleanString = hexString.replaceAll("\\s", "");
        
        // 验证长度（必须是偶数）
        if (cleanString.length() % 2 != 0) {
            throw new IllegalArgumentException("Invalid hex string length: must be even number of hex digits");
        }
        
        // 创建字节数组
        byte[] byteArray = new byte[cleanString.length() / 2];
        
        // 每两个字符解析为一个字节
        for (int i = 0; i < byteArray.length; i++) {
            int index = i * 2;
            String hexByte = cleanString.substring(index, index + 2);
            byteArray[i] = (byte) Integer.parseInt(hexByte, 16);
        }
        
        return byteArray;
    }

    /**
     * 将字节数组打印为连续的十六进制字符串（无分隔符）
     * @param bytes 要打印的字节数组
     */
    public static void printHex(byte[] bytes) {
        printHex(bytes, 0, bytes.length, -1, " ", 0);
    }

    public static String printHexV2(byte[] bytes) {
        return printHexStr(bytes, 0, bytes.length, -1, " ", 0);
    }

    /**
     * 完整功能的十六进制打印方法
     *
     * @param bytes       要打印的字节数组
     * @param offset      起始偏移量
     * @param length      要打印的长度
     * @param bytesPerLine 每行显示的字节数（小于等于0表示不分行）
     * @param delimiter   字节之间的分隔符（null表示无分隔符）
     * @param indent      行首缩进空格数
     */
    public static void printHex(byte[] bytes, int offset, int length,
                                int bytesPerLine, String delimiter, int indent) {
        if (bytes == null) {
            System.out.println("(null)");
            return;
        }

        // 验证参数
        if (offset < 0 || length < 0 || offset + length > bytes.length) {
            throw new IllegalArgumentException("Invalid offset or length");
        }

        // 处理默认值
        if (delimiter == null) delimiter = "";
        if (bytesPerLine <= 0) bytesPerLine = Integer.MAX_VALUE;

        // 创建缩进字符串
        String indentStr = " ".repeat(indent);
        StringBuilder sb = new StringBuilder();

        for (int i = offset; i < offset + length; i++) {
            // 行首缩进
            if ((i - offset) % bytesPerLine == 0 && i > offset) {
                System.out.println(sb.toString());
                sb.setLength(0);
                sb.append(indentStr);
            }

            // 添加字节的十六进制表示
            String hex = String.format("%02X", bytes[i] & 0xFF);
            sb.append(hex);

            // 添加分隔符（不在行尾时添加）
            if (delimiter.length() > 0 && (i - offset) % bytesPerLine != bytesPerLine - 1 && i < offset + length - 1) {
                sb.append(delimiter);
            }
        }

        // 打印剩余内容
        if (sb.length() > 0) {
            System.out.println(sb.toString());
        }
    }

    public static String printHexStr(byte[] bytes, int offset, int length,
                                int bytesPerLine, String delimiter, int indent) {
        if (bytes == null) {
            System.out.println("(null)");
            return "";
        }

        // 验证参数
        if (offset < 0 || length < 0 || offset + length > bytes.length) {
            throw new IllegalArgumentException("Invalid offset or length");
        }

        // 处理默认值
        if (delimiter == null) delimiter = "";
        if (bytesPerLine <= 0) bytesPerLine = Integer.MAX_VALUE;

        // 创建缩进字符串
        String indentStr = " ".repeat(indent);
        StringBuilder sb = new StringBuilder();

        for (int i = offset; i < offset + length; i++) {
            // 行首缩进
            if ((i - offset) % bytesPerLine == 0 && i > offset) {
                System.out.println(sb.toString());
                sb.setLength(0);
                sb.append(indentStr);
            }

            // 添加字节的十六进制表示
            String hex = String.format("%02X", bytes[i] & 0xFF);
            sb.append(hex);

            // 添加分隔符（不在行尾时添加）
            if (delimiter.length() > 0 && (i - offset) % bytesPerLine != bytesPerLine - 1 && i < offset + length - 1) {
                sb.append(delimiter);
            }


        }

        // 打印剩余内容
//        if (sb.length() > 0) {
//            //System.out.println(sb.toString());
//            return sb.toString();
//        }
        return sb.toString();
    }

//    public static void main(String[] args) {
//        String hexStr = "55 01 85 00 16 01 00 9C 18 10 27 74 27 D8 27 3C 28 A0 28 04 29 68 29 CC 29 06 00 AA";
//
//        try {
//            byte[] bytes = hexStringToByteArray(hexStr);
//
//            // 打印验证
//            System.out.println("字节数组长度: " + bytes.length);
//            System.out.println("字节数组内容: " + Arrays.toString(bytes));
//
//            // 十六进制格式打印
//            System.out.print("十六进制: ");
//            for (byte b : bytes) {
//                System.out.print(String.format("%02X ", b));
//            }
//        } catch (IllegalArgumentException e) {
//            System.err.println("转换错误: " + e.getMessage());
//        }
//    }
}